import {
	getToken
} from '@/common/auth';
import cache from '@/common/cache'
// 此vm参数为页面的实例，可以通过它引用vuex中的变量
export const Request = (vm) => {
	// 初始化请求配置
	uni.$uv.http.setConfig((config) => {
		/* config 为默认全局配置*/
		console.log(config,22222222222);
		// #ifdef H5
		config.baseURL = '/api/xc'; /* 根域名 */
		// #endif
		// #ifndef H5
		config.baseURL = uni.$my.serverHost + '/api/xc'; /* 根域名 */
		// #endif
		// 微信小程序一个请求最长15秒
		config.timeout = 15000; // 不可超过 manifest.json 中配置 networkTimeout的超时时间
		// 跨域请求时是否携带凭证（cookies）仅H5支持（HBuilderX 2.6.15+）
		// #ifdef H5
		config.withCredentials = true;
		// #endif
		config.dataType = 'json';
		return config
	})

	// 请求拦截
	uni.$uv.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
		// 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
		console.log(config,1111111);
		config.data = config.data || {}
		config.header['Content-Type'] = 'application/json;charset=utf-8'

		// 是否需要设置 token
		// console.log(config)
		const isToken = (config.header || {}).isToken === false
		const nowToken = getToken()
		if (nowToken && !isToken) {
			config.header['Authorization'] = 'Bearer ' + nowToken
		}
		// 是否需要防止数据重复提交
		const isRepeatSubmit = (config.header || {}).repeatSubmit === false
		// // 根据custom参数中配置的是否需要token，添加对应的请求头
		// if(config?.custom?.auth) {
		// 	// 可以在此通过vm引用vuex中的变量，具体值在vm.$store.state中
		// 	config.header.token = vm.$store.state.userInfo.token
		// }
		// get请求映射params参数
		config.method = config.method.toLowerCase()
		if (config.method === 'get' && config.params) {
			// 修改dateRange
			if (config.params.dateRange && !uni.$uv.test.empty(config.params.dateRange)) {
				if (config.params.dateRange[1].indexOf(' ') === -1) {
					config.params.dateRange[1] = config.params.dateRange[1] + " 23:59:59"
				}
			}
			config.params.platform = uni.$my.nowPlatform()
			if (uni.$uv.test.empty(config.params.shopId)) {
				config.params.shopId = uni.$my.shopId
			}
		}
		if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
			if (uni.$uv.test.empty(config.data.shopId)) {
				config.data.shopId = uni.$my.shopId
			}
			config.data.platform = uni.$my.nowPlatform()
			const requestObj = {
				url: config.url,
				data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
				time: new Date().getTime()
			}
			const sessionObj = cache.session.getJSON('sessionObj')
			if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
				cache.session.setJSON('sessionObj', requestObj)
			} else {
				const s_url = sessionObj.url; // 请求地址
				const s_data = sessionObj.data; // 请求数据
				const s_time = sessionObj.time; // 请求时间
				const interval = 1200; // 间隔时间(ms)，小于此时间视为重复提交
				if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url ===
					requestObj.url) {
					const message = '数据正在处理，请勿重复提交';
					console.warn(`[${s_url}]: ` + message)
					return Promise.reject(new Error(message))
				} else {
					cache.session.setJSON('sessionObj', requestObj)
				}
			}
			setTimeout(() => {
				cache.session.remove('sessionObj')
			}, 1800)
		}
		return config
	}, config => { // 可使用async await 做异步操作
		return Promise.reject(config)
	})

	// 响应拦截
	uni.$uv.http.interceptors.response.use((response) => {
		/* 对响应成功做点什么 可使用async await 做异步操作*/
		const data = response.data
		// console.log(data)
		// 未设置状态码则默认成功状态
		let code = data.code || 200;
		if (code === 10115) {
			//未登录,重新登陆
			uni.$uv.toast(data.msg);
			uni.$my.reLogin();
		}
		return data
	}, (response) => {
		// 对响应错误做点什么 （statusCode !== 200）
		return Promise.reject(response)
	})
}